package com.corpgovernment.organization.entity;

import com.corpgovernment.common.base.BaseUserInfo;
import com.corpgovernment.organization.entity.db.MbOrgInfo;
import com.corpgovernment.organization.enumm.ServiceErrorEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.persistence.Column;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
import java.util.List;

/**
 * 同步组织请求实体
 */
@Data
@EqualsAndHashCode
public class SyncOrganizationRequestEntity extends BaseUserInfo implements Serializable {

    /**
     * 组织列表
     */
    @Valid
    @NotEmpty(message = "组织列表不能为空")
    private List<SyncOrganizationInfoEntity> orgInfoList;
    /**
     * 异步结果回调地址，会通知同步操作的结果；不传则不通知结果
     */
    private String notifyUrl;


    public SyncOrganizationRequestEntity() {
    }

    /**
     * 组织信息
     */
    @Data
    public static class SyncOrganizationInfoEntity implements Serializable {
        /**
         * excel行号
         */
        String lineNo;

        Long recordId;
        /**
         * 是否删除组织（默认不删除）
         */
        Boolean isDelete;
        /**
         * 基本信息，根据orgid判断是新增还是修改
         */
        @Valid
        @NotNull(message = "组织基本信息不能为空")
        private BasicInfoEntity basicInfo;
        /**
         * 联系人信息
         */
        @Valid
        private ContactInfoEntity contactInfo;
        /**
         * 配送地址列表
         */
        @Valid
        private List<InvoiceInfoEntity> invoiceList;
        /**
         * 配送地址列表
         */
        @Valid
        private List<DeliveryAddressEntity> deliveryAddressList;
        /**
         * 组织配置列表
         */
        @Valid
        private List<OrgConfigEntity> orgConfigEntityList;
        /**
         * 支付设置列表
         */
        @Valid
        private List<PayTypeConfigEntity> payTypeConfigList;
        /**
         * 职级信息
         */
        @Valid
        private List<PostInfoEntity> postInfoList;

        /**
         * 保存的上下文
         */
        private MbOrgInfo mbOrgInfo;


        public SyncOrganizationInfoEntity() {
        }


        /**
         * 组织架构基本信息
         */
        @Data
        public static class BasicInfoEntity implements Serializable {

            private String mainLineNo;

            private String lineNo;
            /**
             * 组织ID，对应客户公司组织主键
             */
            @NotBlank(message = "组织ID不能为空")
            private String orgId;
            /**
             * 组织名称
             */
            @NotBlank(message = "组织名称不能为空")
            private String name;
            /**
             * 组织类型（C公司、D部门）
             */
            @NotBlank(message = "组织类型不能为空")
            private String type;
            /**
             * 上级组织ID（顶级组织传空）
             */
            private String parentOrgId;
            /**
             * 顶级组织ID
             */
            private String topOrgId;
            /**
             * 是否启用（为空默认启用）
             */
            private Boolean isActive;
            /**
             * 业务编码
             */
            private String businessCode;
            /**
             * 上级业务编码
             */
            private String parentBusinessCode;
            /**
             * 所属成本中心
             */
            private String costCenterInfo;
            /**
             * 默认成本中心
             */
            private String costCenterInfoDefault;

            public BasicInfoEntity() {
            }
        }


        /**
         * 联系人信息
         */
        @Data
        public static class ContactInfoEntity implements Serializable {

            private String mainLineNo;

            private String lineNo;

            /**
             * 联系人名字
             */
            @NotBlank(message = "联系人名字不能为空")
            private String contactName;
            /**
             * 联系人邮箱
             */
            private String contactEmail;
            /**
             * 电话国家码，如果传电话，不传国家码，默认中国大陆（+86中国大陆，+852中国香港，+886中国台湾，+853中国澳门）
             */
            private String contactCountryCode;
            /**
             * 联系人电话
             */
            @NotBlank(message = "联系人电话不能为空")
            private String contactPhone;


            public ContactInfoEntity() {
            }
        }


        /**
         * 发票信息
         */
        @Data
        public static class InvoiceInfoEntity implements Serializable {

            private String mainLineNo;

            private String lineNo;

            /**
             * 发票抬头
             */
            @NotBlank(message = "发票抬头不能为空")
            private String invoiceTitle;
            /**
             * 纳税人识别号
             */
            @NotBlank(message = "纳税人识别号不能为空")
            @Pattern(regexp = "[0-9A-Za-z]{15,20}", message = "税号必须为15-20位数字或字母！")
            private String taxId;
            /**
             * 开户行
             */
            @NotBlank(message = "开户行不能为空")
            private String accountBank;
            /**
             * 银行账号
             */
            @Pattern(regexp = "^[0-9]*$", message = "银行账号需要是数字")
            private String accountCardNo;
            /**
             * 单位电话
             */
            @NotBlank(message = "单位电话不能为空")
            private String corporationPhone;
            /**
             * 单位地址
             */
            @NotBlank(message = "单位地址不能为空")
            private String corporationAddress;


            public InvoiceInfoEntity() {
            }
        }


        /**
         * 配置地址
         */
        @Data
        public static class DeliveryAddressEntity implements Serializable {

            private String mainLineNo;

            private String lineNo;

            /**
             * 省名
             */
            @NotBlank(message = "省名不能为空")
            private String provinceName;
            /**
             * 市名
             */
            @NotBlank(message = "市名不能为空")
            private String cityName;
            /**
             * 区名
             */
            @NotBlank(message = "区名不能为空")
            private String districtName;
            /**
             * 详细地址
             */
            @NotBlank(message = "详细地址不能为空")
            private String address;

            private String provinceCode;

            private String cityCode;

            private String districtCode;

            /**
             * 邮编
             **/
            private String postCode;
            /**
             * 收件人姓名
             **/
            @NotBlank(message = "收件人姓名不能为空")
            private String recipientName;
            /**
             * 收件人电话国家码
             **/
            private String recipientCountryCode;
            /**
             * 收件人电话
             **/
            @NotBlank(message = "收件人电话不能为空")
            private String recipientPhone;
            /**
             * 是否为默认地址
             */
            private Boolean isDefault;


            public DeliveryAddressEntity() {
            }
        }

        /**
         * 职级信息
         */
        @Data
        public static class PostInfoEntity implements Serializable {

            private String mainLineNo;

            private String lineNo;

            /**
             * 职级名称
             */
            @NotBlank(message = "职级名称不能为空")
            private String name;
        }


        @Data
        public static class OrgConfigEntity {

            private String mainLineNo;

            private String lineNo;

            /**
             * 系统/部门编码
             */
            private String businessCode;

            /**
             * 成本中心是否必填
             */
            private String costCenterIsNeed;
            /**
             * 项目是否必填
             */
            private String projectIsNeed;
            /**
             * 开票方式
             */
            private String type;
        }


        @Data
        public static class PayTypeConfigEntity {

            private String mainLineNo;

            private String lineNo;
            /**
             * 系统/部门编码
             */
            private String businessCode;
            /**
             * 组织ID，对应客户公司组织主键
             */
            private String orgId;
            /**
             * 机票-因公出行
             */
            private String flightPub;
            /**
             * 火车票-因公出行
             */

            private String trainPub;
            /**
             * 国内酒店-因公出行
             */
            private String hotelPub;
            /**
             * 国内酒店-因公出行
             */
            private String carPub;
            /**
             * 国际机票-因公出行
             */
            private String flightintlPub;
            /**
             * 国际酒店-因公出行
             */
            private String hotelintlPub;

        }

    }
}
